home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / ObjList.C < prev    next >
C/C++ Source or Header  |  1990-12-21  |  7KB  |  453 lines

  1. //$ObjLink,ObjList,ObjListIter,RevObjListIter,ObjLink$
  2. #include "ObjList.h"
  3. #include "FixedStorage.h"
  4. #include "System.h"
  5. #include "Storage.h"
  6.  
  7. //---- ObjLink -----------------------------------------------------------------
  8.  
  9. MetaImpl(ObjLink, (TP(next), TP(previous), TP(op), 0));
  10.  
  11. ObjLink::ObjLink(ObjPtr a, ObjLink* n, ObjLink* p)
  12.     op= a; 
  13.     next= n; 
  14.     previous= p; 
  15. }
  16.  
  17. ObjLink::ObjLink(ObjPtr a, ObjLink *l)
  18. {
  19.     op= a;
  20.     next= l;
  21.     previous= l->previous;
  22.     l->previous->next= this;
  23.     l->previous= this;
  24. }
  25.  
  26. ObjLink::~ObjLink()
  27. {
  28. }
  29.  
  30. void ObjLink::FreeAll()
  31. {
  32.     if (op) {
  33.     op->FreeAll();
  34.     SafeDelete(op);
  35.     }
  36. }
  37.  
  38. void *ObjLink::operator new(size_t sz)
  39. {
  40.     return MemPools::Alloc(sz);
  41. }
  42.  
  43. void ObjLink::operator delete(void *vp)
  44. {
  45.     MemPools::Free(vp, sizeof(ObjLink)); 
  46. }
  47.  
  48. //---- ObjList -----------------------------------------------------------------
  49.  
  50. MetaImpl(ObjList, (TP(first), TP(last), 0));
  51.  
  52. ObjList::ObjList()
  53. {
  54.     first= last= 0;
  55. }
  56.  
  57. ObjList::~ObjList()
  58. {
  59.     register ObjLink *l, *ll;
  60.  
  61.     for(l= first; l; l= ll) {
  62.     ll= l->next;
  63.     SafeDelete(l);
  64.     }
  65.     first= last= 0;
  66. }
  67.  
  68. void ObjList::FreeAll()
  69. {
  70.     register ObjLink *l, *ll;
  71.  
  72.     for (l= first; l; l= ll) {
  73.     ll= l->next;
  74.     l->FreeAll();
  75.     SafeDelete(l);
  76.     }
  77.     first= last= 0;
  78.     size= 0;
  79. }
  80.  
  81. void ObjList::RemoveDeleted()
  82. {
  83.     register ObjLink *l, *p;
  84.  
  85.     l= first;
  86.     while (l) {
  87.     p= l;
  88.     l= l->next;
  89.     if (p->op->IsDeleted()) {
  90.         SafeDelete(p->op);
  91.         RemoveLink(p);
  92.     }
  93.     }
  94. }
  95.  
  96. void ObjList::Insert(ObjPtr a)
  97. {
  98.     if (CheckNotNull("Insert", a))
  99.     return;
  100.     CheckActiveIter("Insert");
  101.     first= new ObjLink(a, first, 0);
  102.     if (last == 0)
  103.     last= first;
  104.     else 
  105.     first->next->previous= first;
  106.     size++;
  107.     Changed();
  108. }
  109.  
  110. void ObjList::InsertObjLink(ObjPtr op, ObjLink *l)
  111. {
  112.     new ObjLink(op, l);
  113.     size++;
  114.     Changed();
  115. }
  116.  
  117. ObjLink *ObjList::FindObjLink(ObjPtr op, bool byPtr)
  118. {
  119.     register ObjLink *l;
  120.     for(l= first; l; l= l->next) {
  121.     if (l->op->IsDeleted())
  122.         continue;
  123.     if ((byPtr && l->op == op) || (!byPtr && l->op->IsEqual(op))) 
  124.         return l;
  125.     }
  126.     return 0;
  127. }
  128.  
  129. void ObjList::PrivInsertBefore(ObjPtr before, ObjPtr op, bool byPtr, char *name)
  130. {
  131.     register ObjLink *l;
  132.  
  133.     if (CheckNotNull(name, op))
  134.     return;
  135.     CheckActiveIter(name);
  136.     l= FindObjLink(before, byPtr);
  137.     if (l != 0) 
  138.        if (l == first)
  139.        Insert(op);
  140.        else 
  141.        InsertObjLink(op, l);
  142.     else
  143.     Error(name, "object not found");
  144. }
  145.  
  146. void ObjList::InsertBefore(ObjPtr before, ObjPtr op)
  147. {
  148.     PrivInsertBefore(before, op, FALSE, "InsertBefore");
  149. }
  150.  
  151. void ObjList::InsertBeforePtr(ObjPtr before, ObjPtr op)
  152. {
  153.     PrivInsertBefore(before, op, TRUE, "InsertBeforePtr");
  154. }
  155.  
  156. void ObjList::PrivInsertAfter(ObjPtr after, ObjPtr op, bool byPtr, char *name)
  157. {
  158.     register ObjLink *l;
  159.  
  160.     if (CheckNotNull(name, op))
  161.     return;
  162.     CheckActiveIter(name);
  163.     l= FindObjLink(after, byPtr);
  164.     if (l != 0) {
  165.     l= l->next;
  166.     if (l == 0)
  167.         Add(op); 
  168.     else 
  169.         InsertObjLink(op, l);
  170.     }
  171.     else
  172.     Error (name, "object not found");
  173. }
  174.  
  175. void ObjList::InsertAfter(ObjPtr after, ObjPtr op)
  176. {
  177.     PrivInsertAfter(after, op, FALSE, "InsertAfter");
  178. }
  179.  
  180. void ObjList::InsertAfterPtr(ObjPtr after, ObjPtr op)
  181. {
  182.     PrivInsertAfter(after, op, TRUE, "InsertAfterPtr");
  183. }
  184.  
  185. ObjPtr ObjList::Add(ObjPtr a)
  186. {
  187.     if (CheckNotNull("Add", a))
  188.     return 0;
  189.     CheckActiveIter("Add");
  190.     last= new ObjLink(a, 0, last);
  191.     if (first == 0)
  192.     first= last;
  193.     else
  194.     last->previous->next= last;
  195.     size++;
  196.     Changed();
  197.     return 0;
  198. }
  199.  
  200. ObjPtr ObjList::Replace(ObjPtr a, ObjPtr b)
  201. {
  202.     register ObjLink *l;
  203.     ObjPtr t;
  204.  
  205.     if (CheckNotNull("Replace", b))
  206.     return 0;
  207.     l= FindObjLink(a, TRUE);
  208.     if (l) {
  209.         t= l->op;
  210.         l->op= b;
  211.         Changed();
  212.         return t;
  213.     }
  214.     return 0;
  215. }
  216.  
  217. ObjPtr ObjList::First()
  218. {
  219.     if (Size() == 0)
  220.     return 0;
  221.     return GetAt(0);
  222. }
  223.  
  224. ObjPtr ObjList::Last()
  225. {
  226.     register ObjLink *l;
  227.  
  228.     if (Size() == 0)
  229.     return 0;
  230.     for(l= last; l; l= l->previous) 
  231.     if (!l->op->IsDeleted()) 
  232.         return l->op;
  233.     return 0;
  234. }
  235.  
  236. ObjPtr ObjList::Remove(ObjPtr a)
  237. {   
  238.     register ObjLink *l;
  239.     register ObjPtr op= 0;
  240.  
  241.     if (a == 0)
  242.     return 0;
  243.     for(l= first; l; l= l->next) {
  244.     if (l->op->IsEqual(a)) {
  245.         op= l->op;
  246.         RemoveLink(l);
  247.         break;
  248.     }
  249.     }
  250.     return op;
  251. }
  252.  
  253. ObjPtr ObjList::RemovePtr(ObjPtr a)
  254. {   
  255.     register ObjLink *l;
  256.     register ObjPtr op= 0;
  257.  
  258.     for(l= first; l; l= l->next) {
  259.     if (l->op == a) {
  260.         op= l->op;
  261.         RemoveLink(l);
  262.         break;
  263.     }
  264.     }
  265.     return op;
  266. }
  267.  
  268. void ObjList::RemoveLink(ObjLink *l)
  269. {
  270.     if (InIterator()) {
  271.     l->op= new DeletedObject;
  272.     AnnounceRemove();
  273.     }
  274.     else {
  275.     if (l->next)
  276.         l->next->previous= l->previous;
  277.     else
  278.         last= l->previous;
  279.     if (l->previous)
  280.         l->previous->next= l->next;
  281.     else
  282.         first= l->next;
  283.     delete l;
  284.     size--;
  285.     }
  286.     Changed();
  287. }
  288.  
  289. ObjPtr ObjList::GetAt(int index)
  290. {
  291.     register ObjLink *l;
  292.     register int i= 0;
  293.  
  294.     for(i= 0, l= first; l; l= l->next) {
  295.     if (!l->op->IsDeleted()) {
  296.         if (i == index)
  297.         return l->op;
  298.         i++;
  299.     }
  300.     }
  301.     return 0;
  302. }
  303.  
  304. ObjPtr ObjList::Before(ObjPtr before)
  305. {
  306.     register ObjLink *l;
  307.  
  308.     for (l = first; l; l= l->next) {
  309.     if (l->op->IsEqual(before)) {
  310.         l = l->previous;
  311.         if (l == 0)
  312.         return 0;
  313.         return l->op;
  314.     }
  315.     }    
  316.     if (l == 0)
  317.     Error ("Before", "object not found");
  318.     return 0;
  319. }
  320.  
  321. ObjPtr ObjList::After(ObjPtr after)
  322. {
  323.     register ObjLink *l;
  324.  
  325.     for (l = first; l; l= l->next) {
  326.     if (l->op->IsEqual(after)) {
  327.         l= l->next;
  328.         if (l == 0) 
  329.         return 0;
  330.         return l->op;
  331.     }
  332.     }
  333.     if (l == 0)
  334.     Error ("After", "object not found");
  335.     return 0;
  336. }
  337.  
  338. void ObjList::Empty(int)
  339. {
  340.     CheckActiveIter("Empty");
  341.     RemoveAll(this);
  342. }
  343.  
  344. ObjPtr ObjList::At(int i)
  345. {
  346.     return GetAt(i);
  347. }
  348.  
  349. Iterator *ObjList::MakeIterator() 
  350.     return new ObjListIter(this); 
  351. }
  352.  
  353. Iterator *ObjList::MakeReversedIterator () 
  354.     return new RevObjListIter(this); 
  355. }
  356.  
  357. //---- ObjListIter -------------------------------------------------------------
  358.  
  359. ObjListIter::ObjListIter(Collection *s)
  360. {
  361.     cs= (ObjList*)s; 
  362.     ce= cs ? cs->first : 0; 
  363. }
  364.  
  365. ObjListIter::~ObjListIter()
  366. {
  367.     IteratorEnd();
  368. }
  369.  
  370. void ObjListIter::Reset(Collection *s)
  371. {
  372.     if (s == 0)
  373.     s= Coll();
  374.     cs= (ObjList*)s;
  375.     ce= cs ? cs->first : 0;
  376.     Iterator::Reset(s);
  377. }
  378.  
  379. Collection *ObjListIter::Coll()
  380. {
  381.     return cs;
  382. }
  383.  
  384. Object* ObjListIter::operator()()
  385. {
  386.     Object *op;
  387.  
  388.     if (cs == 0)
  389.     return 0;
  390.     IteratorStart();
  391.  
  392.     while (ce && ce->op->IsDeleted())
  393.     ce= ce->next;
  394.  
  395.     if (ce) {
  396.     op= ce->op;
  397.     ce= ce->next;
  398.     return op;
  399.     }
  400.     ce= cs->first;
  401.     IteratorEnd();
  402.     return 0;
  403. }
  404.  
  405. void *ObjListIter::operator new(size_t sz)
  406. {
  407.     return MemPools::Alloc(sz);
  408. }
  409.  
  410. void ObjListIter::operator delete(void *vp)
  411. {
  412.     MemPools::Free(vp, sizeof(ObjListIter)); 
  413. }
  414.  
  415. //---- RevObjListIter ----------------------------------------------------------
  416.  
  417. RevObjListIter::RevObjListIter(ObjList *s) : ObjListIter(s)
  418.     cs= (ObjList*)s; 
  419.     ce= cs ? cs->last : 0;
  420. }
  421.  
  422. void RevObjListIter::Reset(Collection *s)
  423. {
  424.     ObjListIter::Reset(s);
  425.     ce= cs ? cs->last : 0;
  426. }
  427.  
  428. Object* RevObjListIter::operator()()
  429. {
  430.     Object *op;
  431.  
  432.     if (cs == 0)
  433.     return 0;
  434.     IteratorStart();
  435.  
  436.     while (ce && ce->op->IsDeleted())
  437.     ce= ce->previous;
  438.  
  439.     if (ce) {
  440.     op= ce->op;
  441.     ce= ce->previous;
  442.     return op;
  443.     }
  444.     ce= cs->last;
  445.     IteratorEnd();
  446.     return 0;
  447. }
  448.  
  449.